package com.noble.meether.chat.ui.agora.manager;

import com.noble.glamour.module.logic.application.ModuleMgr;
import com.noble.glamour.module.logic.socket.NetData;
import com.noble.glamour.module.logic.socket.listener.SendCallBack;
import com.noble.library.observe.MsgMgr;
import com.noble.library.observe.MsgType;
import com.noble.library.utils.JsonUtil;
import com.noble.meether.chat.ui.agora.model.AgoraConstant;
import com.noble.meether.chat.ui.agora.model.EngineConfig;
import com.noble.meether.chat.ui.agora.util.RtcUtil;

import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

/**
 * 音视频通信消息管理类： 统一管理，预防丢消息
 * <p>
 * Created by Su on 2017/8/2.
 */
public class RtcMessageMgr {
    private volatile static RtcMessageMgr mInstance;

    private RtcMessageMgr() {
    }

    public static RtcMessageMgr getInstance() {
        if (mInstance == null)
            synchronized (RtcMessageMgr.class) {
                if (mInstance == null)
                    mInstance = new RtcMessageMgr();
            }
        return mInstance;
    }

    private EngineConfig config() {
        return ModuleMgr.getRtcEnginMgr().getEngineConfig();
    }

    // ================================================= 1对1聊天 =======================================

    /**
     * 某用户邀请聊天消息
     */
    public void singleAV(final long dstUid, final int chatType) {
        if (config().isBusy || config().isCalling) {
            ModuleMgr.getRtcChatMgr().sendUserBusyMsg(dstUid, null);
            return;  // 当前用户忙
        }
        ModuleMgr.getRtcChatMgr().sendUserFreeMsg(dstUid, new SendCallBack() {
            @Override
            public void onResult(long msgId, long sender, String contents) {
                ModuleMgr.getRtcChatMgr().openInvitedActivity(dstUid, chatType);
            }

            @Override
            public void onSendFailed(NetData data) {
            }
        });
    }

    /**
     * 对方接受聊天请求
     */
    public void acceptAV(String content) {
        if (RtcUtil.getInstance().isHandleUp()) {
            RtcUtil.getInstance().resetHandleUp();
            return;
        }
        JSONObject jsonObject = JsonUtil.getJsonObject(content);
        EngineConfig config = ModuleMgr.getRtcEnginMgr().getEngineConfig();
        config.mChannel = jsonObject.optString("CName");
        config.mChannelKey = jsonObject.optString("CKey");
        config.mVcid = jsonObject.optLong("IdRecChat");
        sendVideoMsg(AgoraConstant.RTC_MSG_ACCEPT);
    }

    /**
     * 对方拒绝消息
     */
    public void rejectAv(long whisperID) {
        RtcUtil.getInstance().validChat(whisperID);
        RtcMessageMgr.getInstance().sendVideoMsg(AgoraConstant.RTC_MSG_REJECT);
    }

    // ================================================= 男性发起抢聊 =======================================

    /**
     * 男性收： 女性抢聊消息
     */
    public void robGrilMsg(final NetData data) {
        if (!ModuleMgr.getCenterMgr().getMyInfo().isMan())   // 当前用户为女性
            return;

        // 启动建立连接等待页面
        ModuleMgr.getRtcEnginMgr().getEngineConfig().mOtherId = data.getFromId();
        MsgMgr.getInstance().sendMsg(MsgType.MT_Rtc_Group_Chat_Msg, null);
    }

    /**
     * 女性收： 抢聊的男性已经挂断聊天
     */
    public void hasCancelRob(NetData data) {
        if (config().mOtherId != data.getFromId()) {  // 不是本次建立抢聊的用户
            return;
        }
        RtcUtil.getInstance().setCancelRob();
        MsgMgr.getInstance().sendMsg(MsgType.MT_Rtc_Group_Cancel_Msg, null);
    }


    // ===================== 分发音视频通话状态消息 =====================

    /**
     * @param vcTp 请求类型，1邀请加入聊天，2同意加入  3拒绝或取消 4挂断（挂断可能会收到不止一次）
     */
    private void sendVideoMsg(int vcTp) {
        Map<String, Object> data = new HashMap<>();
        data.put("type", vcTp);
        MsgMgr.getInstance().sendMsg(MsgType.MT_Rtc_Chat_Status, data);
    }
}
